<html>
    <head>
        <title>默认后台作业管理器</title>
    </head>
    <body>
        <script>
            /*
                        八、默认后台作业管理器   Default Background Job Manager

                                    ABP 包含了一个简单的 IBackgroundJobManager 实现(实现为以下功能)：
                                      
                                        ①、在单线程中作为 FIFO(First-In First-Out  先进先出原则) 工作。

                                        ②、重试作业执行，知道作业成功运行或超时。记录所有异常

                                                        作业的默认超时时间为 2天。

                                        ③、成功执行后从存储（数据库）中删除作业。
                                                       
                                                        如果超时，它会将其设置为放弃并将其保留在数据库中。

                                        ④、在重试之间越来越多地等待作业。
                                                        
                                                        第一次重试等待1分钟，第二次重试等待2分钟，第三次重试等待4分钟，依此类推。

                                Volo.Abp.BackgroundJobsnuget包包含默认的后台作业管理器，默认安装到启动模板中。


                                1、配置默认后台管理器

                                            在模块类中使用 AbpBackgroundJobWorkerOptions 来配置默认的后台作业管理器。

                                            下面的例子更改的后台作业的超时持续时间：
                                                    
                                                    [DependsOn(typeof(AbpBackgroundJobsModule))]
                                                    public class MyModule : AbpModule
                                                    {
                                                        public override void ConfigureServices(ServiceConfigurationContext context)
                                                        {
                                                            // 配置默认后台作业管理器
                                                            Configure<AbpBackgroundJobWorkerOptions>(options =>
                                                            {
                                                                options.DefaultTimeout = 864000; // 设置默认超时时间，(单位毫秒)
                                                            });
                                                        }
                                                    }
                                            
                                            ServiceConfigurationContext选项类中的选项列表如下：

                                                    ①、JobPollPeriod ： 用于确定两个作业轮询操作之间的间隔。默认值为5000毫秒（5秒）。

                                                    ②、MaxJobFetchCount ：用于确定在单个轮询操作中获取的最大作业数。默认值为1000。

                                                    ③、DefaultFirstWaitDuration ：用于确定第一次重试前等待的持续时间。默认为60秒。

                                                    ④、DefaultTimeout： 用于确定作业的超时持续时间。默认值为172800秒（2天）。

                                                    ⑤、DefaultWaitFactor： 用于确定增加重试之间等待持续时间的因子。默认值为2.0(等待时间系数，实际等待时间是设置的重试等待时间乘以这个系数)

                                                    ⑥、DistributedLockName： 用于确定要使用的分布式锁名。默认为AbpBackgroundJobWorker。

                                        
                                2、数据存储  IBackgroundJobStore
                                
                                           默认的后台作业管理器需要一个数据存储来"保存" 和 "读取" 后台作业。

                                           它将IBackgroundJobStore定义为存储作业的抽象。

                                           后台作业模块使用各种数据访问提供程序实现 IBackgroundJobStore (具体可以查看 "后台作业模块的文档")。

                                           如果你不想使用这个模块，你应该自己实现 IBackgroundJobStore 接口。


                                        ★、默认情况下，后台作业模块已安装到启动模板中，它根据你的ORM/数据访问选择工作。

                                3、集群部署

                                        默认后台作业管理器与集群环境兼容（应用程序的多个实例同时运行）。
                                        
                                        它使用分布式锁来确保作业一次只在单个应用程序实例中执行。

                                        但是，分布式锁系统默认在进程中工作。这意味着它实际上不是分布式的，除非你配置分布式锁提供程序。

                                        因此，请按照分布式锁文档为你的应用程序配置提供程序，如果它尚未配置。

                                        如果你不想使用分布式锁提供程序，你可以使用以下选项：

                                                1、在除一个应用程序实例之外的所有应用程序实例中停止后台作业管理器（将AbpBackgroundJobOptions.IsJobExecutionEnabled设置为false，如禁用作业执行部分所述），
                                                   因此只有单个实例执行作业（而其他应用程序实例仍然可以排队作业）。

                                                2、在所有应用程序实例中停止后台作业管理器（设置AbpBackgroundJobOptions.IsJobExecutionEnabled为false，如禁用作业执行部分所述），
                                                   并创建一个专用应用程序（可能是在其自己的容器中运行的控制台应用程序或在后台运行的Windows服务）来执行所有后台作业。
                                                   如果你的后台作业消耗大量系统资源（CPU、RAM或磁盘），这可能是一个不错的选择，因此你可以将该后台应用程序部署到专用服务器，
                                                   并且你的后台作业不会影响应用程序的性能。
                    */
        </script>
    </body>
</html>